/**
 ***********************************************************************************************************
 * 
 ***********************************************************************************************************
 * @file RBInput.h
 ***********************************************************************************************************/

#ifndef __RBINPUT_H__
#define __RBINPUT_H__

#ifdef  HEADER_ONCE
#pragma HEADER_ONCE
#endif

#ifdef  HEADER_MSG
#pragma HEADER_MSG(RBInput.h)
#endif

/***********************************************************************************************************
 * Includes
 ***********************************************************************************************************/
#include "RBVector.h"

/***********************************************************************************************************
 * Forward declarations
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Classes
 ***********************************************************************************************************/

class RBInput : public RBSingleton<RBInput>
{
public:
    
    typedef uint8 KeyState;
    static const KeyState KS_DOWN = 128;
    static const KeyState KS_UP = 0;

                    RBInput     ();
                   ~RBInput     ();

    enum KeyType
    {
        #define RBINPUTKEY(key, value) IK_##key = value,
        #define RBINPUTKEYASCII(key, value) RBINPUTKEY(key, value)
        #include "RBInputKeys.inl"
        IK_COUNT
    };

    // To call at each frame after input data has been processed
    void            Update      ();
    void            Reset       ();

    bool            IsUp        (KeyType eType);
    bool            IsDown      (KeyType eType);

    bool            IsPressed   (KeyType eType);
    bool            IsReleased  (KeyType eType);

    int2            GetMouseDelta() const;

    void            SetValue    (KeyType eType, KeyState uiState);
    void            SetValues   (KeyState* pValues);

    void            SetMousePos(const int2& pos);

private:

    KeyState        m_aStates[IK_COUNT];
    KeyState        m_aPreviousStates[IK_COUNT];
    int2            m_mousePos;
    int2            m_mousePreviousPos;
};

/***********************************************************************************************************/

#endif // __RBINPUT_H__
